// repository包实现了对数据库的访问
// 遵循整洁架构的原则, 仓储层负责数据的存取, 而不包含业务逻辑
package repository

import (
	"context"
	"errors"

	"gitee.com/jiebaiyou/formflow/model"
	"gitee.com/jiebaiyou/formflow/pkg/storage/redis"
	"gitee.com/jiebaiyou/formflow/pkg/storage/sqlite"
)

// userRepository 用户仓储实现
// 实现了model.UserRepository接口, 负责用户数据的持久化
type userRepository struct {
	db    sqlite.DB      // SQLite数据库实例
	cache redis.Database // Redis数据库实例
}

// NewUserRepository 创建用户仓储实例
func NewUserRepository(db sqlite.DB, cache redis.Database) model.UserRepository {
	return &userRepository{
		db:    db,
		cache: cache,
	}
}

// Create 创建新用户
func (ur *userRepository) Create(c context.Context, user *model.User) error {
	return ur.db.Create(user)
}

// Fetch 获取所有用户列表
func (ur *userRepository) Fetch(c context.Context) ([]model.User, error) {
	var users []model.User
	err := ur.db.Find(&users)
	if err != nil {
		return nil, err
	}
	return users, nil
}

// GetByEmail 通过邮箱查询用户
func (ur *userRepository) GetByEmail(c context.Context, email string) (model.User, error) {
	var user model.User
	err := ur.db.Where("email = ?", email).First(&user)
	return user, err
}

// GetByID 通过ID查询用户
func (ur *userRepository) GetByID(c context.Context, id uint) (model.User, error) {
	var user model.User
	err := ur.db.First(&user, id)
	if err != nil {
		return user, errors.New("user not found")
	}
	return user, nil
}
